/* Firmware für den ATmega32U4 eines Arduino Pro Micro
Henrik Haftmann
190512 erstellt
190601 gestrafft, Code in C++-Dateien (nicht in H-Datei zwecks Übersichtlichkeit)
Funktionsprinzip:
Ein Teil des Flash-Speichers (hier 24 KByte) wird als Datenspeicher verwendet.
Die Speicherverwaltung des Flashs erfolgt sektorweise (= 128 Byte).
Keine Unterverzeichnisse.
Im EEPROM ist die FAT untergebracht: Jedes Byte zeigt auf den Folgesektor der Datei.
Es gibt maximal ca. 200 Sektoren. 0xFF = Freispeicher, 0xFE = Ende einer Kette.
Im EEPROM ist auch die Liste der Dateianfänge untergebracht (max. bspw. 32).
= Wurzelverzeichnis
Eine Datei identifiziert sich durch den Index in dieser Liste.
Der erste Sektor einer Datei ist für Attribute (v.a. Byte-Größe) und Dateiname reserviert.
Daher maximale Länge des Namens = 115 UTF8-Bytes.
Interrupts werden hier nicht verwendet.
*/
#include <avr/io.h>
#include <avr/sleep.h>
#include "usb.h"
#include "MTP.h"
/***********************************************
* Generelle Initialisierung und Hauptprogramm *
***********************************************/
static void setupHardware(void) {
MCUCR = 0x80; // JTAG deaktivieren (sonst gehen PF4..PF7 = ADC4..ADC7 nicht)
MCUSR = 0; // WDRF löschen, damit das nachfolgende Deaktivieren des Watchdogs klappt
WDTCSR|=0x18; // Watchdog deaktivieren
WDTCSR= 0;
CLKPR = 0x80;
CLKPR = 0x00; // CLKDIV8-Fuse ist ab Werk gesetzt: Löschen!
SMCR = 0x01; // Sleep aktivieren
PRR0 = 0x84; // I²C, SPI aus
PRR1 = 0x09; // Timer3, USART aus
PORTB = 0x81; // Pullups an Eingängen, Low an Ausgängen
PORTC = 0xFF;
PORTD = 0x7F;
PORTF = 0xFF;
DDRB |= 0x01; // LED RX
DDRD |= 0x20; // LED TX
ACSR = 0x80; // Analogvergleicher deaktivieren
}
static void idle() {
usbPoll();
MTP::pollUSB();
}
int main() {
setupHardware();
usbInit();
EEARH=0;
for(;;) idle();
}
// Callback, wird von usb.cpp aufgerufen wenn der PC etwas gesendet hat
void handleEp0Out() {
}
Detected encoding: UTF-8 | 0
|